<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>

//【示例1】针对上节示例中定义的三级嵌套对象，使用下面代码可以访问最里层对象属性y的值。
alert(o.y.y.y) ,	// 读取第三层对象的属性y的值，返回false
//【示例2】从结构上分析，对象与数组相似，因此可以使用中括号来访问对象属性。针对上面示例，可以使用如下方式来读取最内层的对象属性y的值。
alert(o["y"]["y"]["y"]),	// 读取第三层对象的属性y的值，返回false
//【示例3】对象是属性的集合，因此可以使用for/in语句来遍历对象属性。这对于无法确定对象包含属性时，是非常有用的。
o = {	// 定义对象
    x:1,
    y:2,
    z:3
}
for(var i in o){ 	// 遍历对象属性
    alert(o[i]); 	// 读取对象的属性值
}
//【示例4】在下面示例中，构造一个类型Pasta，使用new运算符实例化Pasta，然后使用Object.getPrototypeOf函数获取实例对象spaghetti的原型，最后使用该实例对象的原型属性（Pasta.prototype）与Object.getPrototypeOf返回值比较，返回值为true。
function Pasta(grain, width) {
    this.grain = grain;
    this.width = width;
}
var spaghetti = new Pasta("wheat", 0.2);
var proto = Object.getPrototypeOf(spaghetti);
document.write(proto === Pasta.prototype);		//true
//【示例5】在下面示例中创建一个对象，该对象包含三个属性和一个方法。然后使用 getOwnPropertyNames获取该对象的私有属性（包括方法）。
function Pasta(grain, width, shape) {
    this.grain = grain;
    this.width = width;
    this.shape = shape;
    this.toString = function () {
        return (this.grain + ", " + this.width + ", " + this.shape);
    }
}
var spaghetti = new Pasta("wheat", 0.2, "circle");
var arr = Object.getOwnPropertyNames(spaghetti);
document.write (arr);			//返回私有属性：grain,width,shape,toString
//【示例6】在下面示例中创建一个对象obj，添加属性newDataProperty，然后使用Object.getOwnPropertyDescriptor获取该数据属性描述符，并使用该描述符将属性设置为只读。最后，再调用Object.defineProperty函数，使用descriptor描述符修改属性newDataProperty的特性。遍历修改后的对象，可以发现只读特性writable为false，如图9.3所示。
var obj = {};
obj.newDataProperty = "abc";
var descriptor = Object.getOwnPropertyDescriptor(obj, "newDataProperty");
descriptor.writable = false;
Object.defineProperty(obj, "newDataProperty", descriptor);
var desc2 = Object.getOwnPropertyDescriptor(obj, "newDataProperty");
for (var prop in desc2) {
    document.write(prop + ': ' + desc2[prop]);
    document.write("<br />");
}
</script>
</head>

<body>
</body>
</html>
